﻿using System.Collections.Generic;
using System.Linq;
using Inovout.Data.Domain;

namespace Inovout.Data.Repository
{
    /// <summary>
    /// 基于NHibernate的IQueryable对象实例，接口封装
    /// </summary>
    /// <typeparam name="TModel">模型类型</typeparam>
    public interface IQueryableRepository<TModel>
    {
        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。有状态的Session。
        /// </summary>
        /// <typeparam name="TModel">模型类型</typeparam>
        /// <param name="queryCriteria">查询规则对象实例</param>
        /// <returns>有状态的IQueryable对象实例</returns>
        IQueryable<TModel> Query(QueryCriteria queryCriteria);
        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。有状态的Session。
        /// </summary>
        /// <typeparam name="TModel">模型类型</typeparam>
        /// <param name="queryCriteria">查询规则对象实例</param>
        /// <returns>无状态IQueryable对象实例</returns>
        IQueryable<TModel> StatelessQuery(QueryCriteria queryCriteria);
    }
    /// <summary>
    /// Repository的接口定义
    /// </summary>
    /// <typeparam name="TModel">模型类型</typeparam>
    public interface IRepository<TModel> : IQueryableRepository<TModel>
    {
        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="model">模型对象实例</param>
        void Save(TModel model);

        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="model">模型对象实例</param>
        void SaveOrUpdate(TModel model);

        /// <summary>
        /// 批量插入，Id生成必须为非数据库生成，如：Guid
        /// </summary>
        /// <param name="models">模型对象集合</param>
        void BulkInsert(IEnumerable<TModel> models);
        /// <summary>
        /// 批量更新，Id生成必须为非数据库生成，如：Guid，且不能为乐观锁，如：Version
        /// </summary>
        /// <param name="models">模型对象集合</param>
        void BulkUpdate(IEnumerable<TModel> models);

        /// <summary>
        /// 删除模型
        /// </summary>
        /// <param name="model">模型对象实例</param>
        void Delete(TModel model);
        /// <summary>
        /// 批量删除
        /// </summary>
        /// <param name="models">模型对象集合</param>
        void BulkDelete(IEnumerable<TModel> models);

        /// <summary>
        /// 通过主键查找模型
        /// </summary>
        /// <typeparam name="TModel">模型类型</typeparam>
        /// <param name="id">主键</param>
        /// <returns>模型对象实例</returns>
        TModel FindById(object id);
        /// <summary>
        /// 重新回棋模型，在多线程开发时使用，用于切换不同线程的Session对象实例
        /// </summary>
        /// <param name="model">模型对象实例</param>
        void Load(TModel model);

        /// <summary>
        /// 查询所有的模型集合
        /// </summary>
        /// <returns>模型对象集合</returns>
        IEnumerable<TModel> FindAll();
        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。有状态的Session。
        /// </summary>
        /// <returns>有状态IQueryable对象实例</returns>
        IQueryable<TModel> Query();
        /// <summary>
        /// 基于NHibernate的IQueryable对象实例。无状态的Session。
        /// </summary>
        /// <returns>无状态的IQueryable对象实例</returns>
        IQueryable<TModel> StatelessQuery();
        //IndexedDataObjectPagedSet<TModel> Search(Func<QueryContainerDescriptor<TModel>, QueryContainer> query, int pageIndex = 1, int pageSize = 10);
    }
}
